
package practicabeta;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSetMetaData;
import com.mysql.jdbc.Statement;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Familia Roma
 */
public class ResultSetTableModel extends AbstractTableModel {
private Connection connection;
private Statement st;
private ResultSet resultSet;
private ResultSetMetaData metaData;
private int numfilas;

   public ResultSetTableModel(String consulta ) throws SQLException, ClassNotFoundException, IOException
 {
 // codigo para conectar la a la base de datos "practicamayo"

            MysqlDataSource dataSource = new MysqlDataSource();
            dataSource.setUser("root");
            dataSource.setPassword("");
            dataSource.setDatabaseName("practicasp8");
            dataSource.setServerName("localhost");
             // coneccion

            connection = (Connection) dataSource.getConnection();

// actualmente esta conectado

 // crea un statement
 st = (Statement) connection.createStatement(
 ResultSet.TYPE_SCROLL_INSENSITIVE,
 ResultSet.CONCUR_READ_ONLY );

 // consulta predeterminada
 setQuery( consulta );
 }

 // tipo de columna
    @Override
 public Class getColumnClass( int column )
 {
 // determina la clase de columna
 try {
 String className = metaData.getColumnClassName( column + 1 );

 // devuelve el tipo que es la columna
 return Class.forName( className );
 }


 catch ( Exception exception ) {
 exception.printStackTrace();
 }

 // si hay problemas o no la reconoce seria tipo object qee seria la imagen
 return Object.class;
 }

 // metodo para saber el numero de columnas
 public int getColumnCount()
 {
 // determine number of columns
 try {
 return metaData.getColumnCount();
 }





 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }

 // si no hay columnas regresara 0 columnas
 return 0;
 }

// metodo para el nombre de cada columna
    @Override
 public String getColumnName( int column )
 {
//determina el nombre OJO miremos qee estamos usando un objeto de la clase metaData
try {
 return metaData.getColumnName( column + 1 );
 }

 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }

//si no tiene nombre enviara "" es decir un string vacio
return "";
 }

//metodo para saber el numero de filas
    public int getRowCount()
 {
 return numfilas; // no va en un try and catch por qee no ocasionara un problema
 }

 // obtener el valor de la fila y columan
 public Object getValueAt( int row, int column )
 {
 // obtiene un valor especifico del result set.
 try {
 resultSet.absolute( row + 1 );

return resultSet.getObject( column + 1 );
 }

 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }

//si no hay valor enviara vacio
 return "";
 }


// cerrar statement y la coneccion
    @Override
 protected void finalize()
 {

 try {
 st.close();
 connection.close();
 }


 catch ( SQLException sqlException ) {
 sqlException.printStackTrace();
 }
 }

 // declara la consulta
 public void setQuery( String consulta ) throws SQLException, IOException
 {
 //especifica la consulta y la ejecuta
 resultSet = (ResultSet) st.executeQuery( consulta );

 // obtiene los datos de resultSet
 metaData = (ResultSetMetaData) resultSet.getMetaData();

// determina el final de filas
 resultSet.last(); // se mueve a la ultima fila
 numfilas = resultSet.getRow(); // la cantidad de filas

 // estructura de la tabla cambiada
 fireTableStructureChanged();
 }

}
